package com.itheima.d1_properties;

import java.io.FileReader;
import java.util.Properties;
import java.util.Set;

/**
 * 目标：掌握使用Properties类读取属性文件中的键值对信息。
 *      Java里面万物皆对象，所以属性文件当然也是看做一种对象，当然也可以通过一个类来代表属性文件，Properties就是代表属性文件的，Properties的对象就可以代表一个具体的属性文件
 *  Properties：
 *      是一个Map集合（键值对集合），但是我们一般不会当集合使用。
 *      核心作用：Properties是用来代表属性文件的，通过Properties可以读写属性文件里的内容。
 *
 *使用Properties读取属性文件里的键值对数据
 *      构造器
 *  public Properties()     用于构建Properties集合对象（空容器）
 *      常用方法
 *  public void load(InputStream is)    通过字节输入流，读取属性文件里的键值对数据
 *  public void load(Reader reader)     通过字符输入流，读取属性文件里的键值对数据
 *  public String getProperty(String key)       根据键获取值(其实就是get方法的效果)    补充：文件中读和写都是字符串的形式，该方法能保证都是在通过字符串进行操作
 *  public Set<String> stringPropertyNames()    获取全部键的集合（其实就是ketSet方法的效果）
 *
 * 使用Properties把键值对数据写出到属性文件里去
 *  public Object setProperty(String key, String value)     保存键值对数据到Properties对象中去。
 *  public void store(OutputStream os, String comments)     把键值对数据，通过字节输出流写出到属性文件里去，store方法的第二个参数是声明一些注释，也会保存在属性文件中
 *  public void store(Writer w, String comments)            把键值对数据，通过字符输出流写出到属性文件里去，store方法的第二个参数是声明一些注释，也会保存在属性文件中
 *
 *类型：
 *  特殊的文本文件，属性文件：一般都是.properties结尾，#后面是注释，属性文件内容都是键值对，键不重复
 *  XML文件：一般都是.xml结尾，<!--里面的是注释-->
 *作用：存储有关系的数据，做为系统的配置文件，做为信息进行传输
 *
 * 日志：
 *      把程序运行的信息，记录到文件中，方便程序员定位bug、并了解程序的执行情况等
 */
public class PropertiesTest1 {
    public static void main(String[] args) throws Exception {
        // 1、创建一个Properties的对象出来（键值对集合，空容器）
        Properties properties = new Properties();
        System.out.println(properties);

        // 2、开始加载属性文件中的键值对数据到properties对象中去，有异常直接抛出去
        properties.load(new FileReader("Day10Properties-Xml-Log-App\\src\\users.properties"));
        System.out.println(properties);

        // 3、根据键取值
        System.out.println(properties.getProperty("赵敏"));
        System.out.println(properties.getProperty("张无忌"));

        System.out.println("---------------------");

        // 4、遍历全部的键和值。
        Set<String> keys = properties.stringPropertyNames();
        for (String key : keys) {
            String value = properties.getProperty(key);
            System.out.println(key + "---->" + value);
        }

        System.out.println("-----------------------------把properties文件看做map集合来遍历---------------");

        //Properties本质是map集合，所以可以通过jdk1.8提供的lambda表达式的foreach方法来遍历，map集合键值对
        properties.forEach((k, v) -> {
            System.out.println(k + "---->" + v);
        });

        System.out.println("-------------------自己试一试属性文件的读写-----------");

        Properties zengproperties = new Properties();
        System.out.println("刚开始的Properties集合对象（空容器）： "+zengproperties);
        zengproperties.load(new FileReader("Day10Properties-Xml-Log-App\\src\\zeng1.properties"));
        Set<String> zengstrings = zengproperties.stringPropertyNames();

        //用stream流试试
        zengstrings.stream().forEach(s-> System.out.println(zengproperties.getProperty(s)));

        System.out.println("------------不用stream流,用for循环全部键的集合---------");

        for (String zengstring : zengstrings) {
            String zvalue = zengproperties.getProperty(zengstring);
            System.out.println("键是："+zengstring+"-->"+"值是："+zvalue);
        }

        System.out.println("-----------用map集合的foreach方法遍历输出键值对--------");
        zengproperties.forEach((k,v)->{
            System.out.println(k+"---->"+v);
        });

    }
}
